package br.com.sig.cadastro.recursoshumanos.presentation.action;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.sig.business.exception.BaseException;
import br.com.sig.cadastro.pessoas.business.model.embeddable.Conjuge;
import br.com.sig.cadastro.pessoas.business.model.embeddable.Mae;
import br.com.sig.cadastro.pessoas.business.model.embeddable.MeioDeContato;
import br.com.sig.cadastro.pessoas.business.model.entity.PessoaFisica;
import br.com.sig.cadastro.recursoshumanos.business.model.bo.FuncionarioBO;
import br.com.sig.cadastro.recursoshumanos.business.model.embeddable.ReferenciaProfissional;
import br.com.sig.cadastro.recursoshumanos.business.model.entity.Chefia;
import br.com.sig.cadastro.recursoshumanos.business.model.entity.Funcionario;
import br.com.sig.cadastro.recursoshumanos.business.service.FuncionarioService;
import br.com.sig.presentation.action.BaseAction;

@Named
@ViewScoped
public class FuncionarioAction extends BaseAction<Funcionario> {

	private static final long serialVersionUID = -8210363950386680152L;
	
	@Inject
	private FuncionarioBO funcionarioBO;
	
	@Inject
	private FuncionarioService funcionarioService;

	@PostConstruct
	public void init() {
		setService(funcionarioBO);
	}
	
	@Override
	public void persist() throws BaseException {
		try {
			funcionarioService.persist(getInstance());
			afterPersist();
		} catch (BaseException e) {
			messages.error(e.getMessage());
		}
	}
	
	@Override
	public void update() {
		try {
			funcionarioService.update(getInstance());
			afterUpdate();
		} catch (BaseException e) {
			messages.error(e.getMessage());
		}
	}
	
	@Override
	protected Funcionario createInstance() {
		Funcionario funcionario = super.createInstance();
		funcionario.setPessoaFisica(new PessoaFisica());
		funcionario.setConjuge(new Conjuge());
		funcionario.getConjuge().setMeioDeContato(new MeioDeContato());
		funcionario.setMae(new Mae());
		funcionario.getMae().setMeioDeContato(new MeioDeContato());
		funcionario.setReferenciaProfissional(new ReferenciaProfissional());
		funcionario.getReferenciaProfissional().setMeioDeContato(new MeioDeContato());
		funcionario.setChefias(new ArrayList<Chefia>());
		return funcionario;
	}
	
	@Override
	public void initInstance() {
		super.initInstance();
		
		if (getInstance().getMae().getMeioDeContato() == null) {
			getInstance().getMae().setMeioDeContato(new MeioDeContato());
		}
		
		if (getInstance().getConjuge() == null) {
			getInstance().setConjuge(new Conjuge());
		}
		
		if (getInstance().getConjuge().getMeioDeContato() == null) {
			getInstance().getConjuge().setMeioDeContato(new MeioDeContato());
		}
		
		if (getInstance().getReferenciaProfissional() == null) {
			getInstance().setReferenciaProfissional(new ReferenciaProfissional());					
		}
		
		if (getInstance().getReferenciaProfissional().getMeioDeContato() == null) {
			getInstance().getReferenciaProfissional().setMeioDeContato(new MeioDeContato());
		}
	}
	
	public boolean hasPessoaFisica() {
		return getInstance().getPessoaFisica() != null && getInstance().getPessoaFisica().getId() != null;
	}
	
	public void resetInputs() {
		
		if (getInstance().getPossuiFilho() != null && !getInstance().getPossuiFilho()) {
			getInstance().setQuantidadeDeFilho(null);
		}
		
		if (getInstance().getPossuiProblemaDeSaude() != null && !getInstance().getPossuiProblemaDeSaude()) {
			getInstance().setProblemaDeSaude(null);
		}
		
		if (getInstance().getPossuiAlergia() != null && !getInstance().getPossuiAlergia()) {
			getInstance().setAlergia(null);
		}		
	}
}